package com.line.config.auth;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableSwagger2 // 启动swagger
public class AuthConfiguration implements WebMvcConfigurer {

	/**
	 * 实例化授权拦截器
	 *
	 * @return 拦截器对象
	 */
	@Bean
	public AuthInterceptor httpInterceptor() {
		return new AuthInterceptor();
	}

	/**
	 * 将拦截器注册到容器中
	 *
	 * @param registry
	 *            拦截器注册实例
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(httpInterceptor()) // 将拦截器注册
				.addPathPatterns("/**") // 拦截所有的请求
				.excludePathPatterns( // 添加过滤规则，以下所有符合规则的接口都不需要拦截
						"/auth/token", // 授权接口
						"/druid/**", // druid数据源接口
						"/table/generate", // 生成数据表实体

						/**
						 * swagger过滤
						 */
						"/doc.html/**", //
						"/swagger-resources/**", //
						"/v2/**", //
						"/webjars/**");
	}

	@Bean
	public Docket api() {
		ParameterBuilder tokenParam = new ParameterBuilder();
		List<Parameter> params = new ArrayList<Parameter>();
		tokenParam.name("access_token") // 参数名称
				.description("访问令牌，部分无需授权接口可忽略当前接口") // 参数描述
				.modelRef(new ModelRef("string")) // 参数数据类型
				.parameterType("query") // 参数请求类型
				.required(false) // 是否必填，true为必填，false为非必填
				.build();
		params.add(tokenParam.build());
		return new Docket(DocumentationType.SWAGGER_2) // 构建实例名称
				.apiInfo(apiInfo()) // 初始化api的基本信息
				.select() // 与下面方法公用，过滤规则
				.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot"))) // 监控哪些接口需要展示
				.build() // 构建
				.globalOperationParameters(params) // 添加公用参数
		;
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
		registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder() //
				.title("小CK物流查询") //
				.description("小CK物流查询系统接口文档") //
				.termsOfServiceUrl("https://www.59line.com") //
				.version("1.0") //
				.license("Focus Yang") //
				.build();
	}
}
